#多任务
'''
同一时间内执行多个任务


多任务的执行方式：
1）并发：指两个或多个事件在同一个时间段内交替执行。
（任务数多于CPU核数时，通过操作系统的各种任务调度
算法，来实现多个任务“一起”执行的效果）


2）并行：指两个或多个事件在同一时刻发生。
（任务数小于等于cpu核数，即任务是一起执行的。）

'''
#进程：打开一个程序至少就会有一个进程。
'''
一个正在运行的程序或者软件就是一个进程，它是操作系统进行资源
分配的基本单位。

一个进程默认至少有一个线程，进程里可以创建多个线程，线程是依附
在进程里面的，没有进程就没有线程。

程序启动默认会有一个主线程（线程是程序执行的最小单位）

程序员自己创建的线程可以成为子线程，多线程可以完成多任务。
'''
#例：单线程
import time
def speak():
    print('欢迎大家来到流星教育')
    time.sleep(2)  #睡眠2秒
    print('Welcome to sixstaredu.com')

def dance():
    print('生活要有仪式感')
    time.sleep(2)
    print('跳个舞来感受一下')

if __name__ == '__main__':
    speak()
    dance()
print('===============================================================')
print('\n')

#多线程
'''
使用threading模块里面的Thread类创建出实例对象，然后通过
start()方法真正的去产生一个新的线程。

程序启动默认会有一个主线程。

通过start()方法来启动子线程。
'''
#线程模块：import threading
'''
线程类Thread参数：
group:线程组
target:执行的目标的任务名
args:以元组的方式给执行任务进行传参
*args:传任务多个参数
kwargs:以字典方式给执行任务传参
name:线程名
'''
#步骤
'''
1.导入模块 threading
2.创建子线程 Thread()类
3.守护线程 setDaemon  #(设置守护线程后，主线程执行完毕，子线程也跟着结束)
4.启动子线程 start()
5.阻塞主线程 jion()  #a.jion() a为子线程，阻塞主线程，主线程
会等待子线程a执行完毕，再执行下面的代码。

'''
#单线程
import time
t1 = time.time()
def dance(name):
    print('%s 在跳鬼步舞'%name)
    time.sleep(1) #睡眠1秒

if __name__=='__main__':
    for i in range(4):
        dance('Telli')

t2 = time.time()
print('执行时间是：',t2-t1)  #4.193987607955933
print('===============================================================')
print('\n')

#多线程
import time
import threading
t1 = time.time()
def dance(name):
    print('%s 在跳鬼步舞'%name)
    time.sleep(1) #睡眠1秒

if __name__=='__main__':
    for i in range(4):
        #创建线程
        t = threading.Thread(target=dance,args=('Telli',)) #一个元素的元组要加“,”
        t.start()   #启动线程
t2 = time.time()
print('执行时间是：',t2-t1)  #0.003003358840942383
print('===============================================================')
print('\n')


#多线程进阶举例
import time
from threading import Thread  #导入Thread类

def funa():
    print('学习')
    time.sleep(2)
    print('是黎明前的黑暗')

def funb():
    print('来六星')
    time.sleep(2)
    print('面包骗子朋友都会有的')

if __name__=='__main__':#程序文件如果直接运行，则执行下面代码
    #创建子线程
    f1 = Thread(target=funa)
    f2 = Thread(target=funb)

    #设置守护线程
    f1.daemon = True
    f2.daemon = True

    #开启子线程
    f1.start()
    f2.start()

    #阻塞主线程
    f1.join()
    f2.join()

    #修改线程名字
    f1.name = '线程1'
    f2.name = '线程2'

    #获取名字
    print(f1.getName)
    print(f2.getName)
  
    print('这是主线程，哈哈')














